今天要來介紹的是表達式~表達式用來做對值的運算,一個表達式包含了變數以及運算符,這在組合邏輯電路和時序邏輯電路的設計裡是重要的部分。
用來執行加減乘除運算。
| 運算 | 符號 | 
|---|---|
| 加 | + | 
| 減 | - | 
| 乘 | * | 
| 除 | / | 
| 取餘數 | % | 
以verilog寫入的話:
module expression_example(A,B,C);
	input A,B;
	output C;
	reg result;
	
	initial begin
		result = A + B; //加法
        //A-B, A*B, A/B, A%B
	end
	
	assign C = result;
	
endmodule
用來比較兩個值,返回結果的type為bool。
| 關係 | 符號 | 
|---|---|
| 等於 | == | 
| 不等於 | != | 
| 小於 | < | 
| 小於等於 | <= | 
| 大於 | > | 
| 大於等於 | >= | 
用來執行邏輯運算,返回結果的type為bool。
| 邏輯 | 符號 | 
|---|---|
| 邏輯與 | && | 
| 邏輯或 | || | 
| 邏輯非 | ! | 
就是對數值做位移操作。
| 移動 | 符號 | 說明 | 
|---|---|---|
| 邏輯左移 | << | 對值乘上2^n, n = 位移量 | 
| 邏輯右移 | >> | 對值除以2^n, n = 位移量 | 
他的結構是:表達式:( a ? b : c )
其中a為條件,條件成立的狀況下會傳回b,不成立則傳回c。
這邊舉個例子:
module newwork(condition,C);
	input condition;
	output [3:0]C;
	reg [3:0]a,b;
	reg [3:0]result;
	//reg condition;
	
	initial begin
		a = 4'b0101;
		b = 4'b0011;
		result = condition ? a : b;
	end
	
	assign C = result;
	
endmodule
result的值取決於condition,如果condition的值為1,則result的值為a(5);如果condition的值為0,則result的值為b(3),最後再將result傳給C做輸出。
assign的功能之一是賦值到wire(net)型別的訊號。
//assign 基本語法
assign <網路信號> = <表達式>;
//舉例
module expression_example(A,B,C);
	input A,B;
	output C;
	wire a,b,c;
	and( a, A, B ); //a = AB
	and( b, B, C ); //b = BC
	assign c = ~C; //c = C'
	
endmodule
這邊要稍微注意的是,assign只適用在net型別的訊號,無法用在reg的型別,所以assign的等號左式不能放reg的類別喔!而等號的右式可以為reg或net。
且assign的左式不能包含右式存在的訊號,因為assign不存在記憶性,這點跟C有很大的不同。
a = a + b; //C允許,但verilog不行
這裡再舉一個assign的例子:
module expression_example(A,B,C);
	input [3:0] A;
	input [3:0] B;
	output [3:0] C;
	
	assign C = A + B; //加法
endmodule
今天就到這邊~